//
// Cuisinier.cpp for plazza in /home/peelou/SVN/pizzaillo
// 
// Made by gery baudry
// Login   <baudry_g@epitech.net>
// 
// Started on  Mon Apr 15 16:26:56 2013 gery baudry
// Last update Wed Apr 17 16:38:32 2013 kevin lansel
//

#include	"Cuisinier.hpp"

using namespace std;

Cuisinier::Cuisinier()
{
}

Cuisinier::~Cuisinier()
{
}

APizza		*Cuisinier::createpizza(int id)
{
  map<TypePizza, APizza *(Factory::*)(TaillePizza, Stock *, int)>	mappy;
  APizza								*pizza;
  Factory								fact;

  if (this->_en_prepa == false && this->_en_attente == false)
    return NULL;
  mappy[PRegina] = &Factory::createRegina;
  mappy[PMargarita] = &Factory::createMargarita;
  mappy[PAmericaine] = &Factory::createAmericaine;
  mappy[PFantasia] = &Factory::createFantasia;
  if (this->_typ_pizactu == PRegina || this->_typ_pizactu == PMargarita ||
      this->_typ_pizactu == PAmericaine || this->_typ_pizactu == PFantasia)
    {
      APizza *(Factory::*tmp)(TaillePizza, Stock *, int) = mappy[this->_typ_pizactu];
      pizza = (fact.*tmp)(this->_tai_pizactu, this->_check, id);
      this->_en_prepa = this->_en_attente;
      this->_tai_pizactu = this->_tai_pizatt;
      this->_typ_pizactu = this->_typ_pizatt;
      this->_en_attente = false;
      this->_tai_pizatt = No_taille;
      this->_typ_pizatt = No_type;
      return pizza;
    }
  else
    return NULL;
}

bool		Cuisinier::setCommande(TypePizza type, TaillePizza taille)
{
  if (this->_en_prepa == true && this->_en_attente == true)
    return false;
  else if (this->_en_prepa == true)
    {
      this->_en_attente = true;
      this->_typ_pizatt = type;
      this->_tai_pizatt = taille;
    }
  else
    {
      this->_en_prepa = true;
      this->_typ_pizactu = type;
      this->_tai_pizactu = taille;
    }
  return true;
}

/*
** Getter
*/

bool		Cuisinier::getEn_prepa() const
{
  return (this->_en_prepa);
}

bool		Cuisinier::getEn_attente() const
{
  return (this->_en_attente);
}

TaillePizza	Cuisinier::getTai_pizactu() const
{
  return (this->_tai_pizactu);
}

TaillePizza	Cuisinier::getTai_pizatt() const
{
  return (this->_tai_pizatt);
}

TypePizza	Cuisinier::getTyp_pizactu() const
{
  return (this->_typ_pizactu);
}

TypePizza	Cuisinier::getTyp_pizatt() const
{
  return (this->_typ_pizatt);
}

Time		Cuisinier::getTime() const
{
  return (this->_t);
}

Stock		*Cuisinier::getStock() const
{
  return (this->_check);
}

/*
**Setter
*/

void		Cuisinier::setEn_prepa(bool en_prepa)
{
  this->_en_prepa = en_prepa;
}

void		Cuisinier::setEn_attente(bool en_attente)
{
  this->_en_attente = en_attente;
}

void	Cuisinier::setTai_pizactu(TaillePizza tai_pizactu)
{
  this->_tai_pizactu = tai_pizactu;
}

void	Cuisinier::setTai_pizatt(TaillePizza tai_pizatt)
{
  this->_tai_pizatt = tai_pizatt;
}

void	Cuisinier::setTyp_pizactu(TypePizza typ_pizactu)
{
  this->_typ_pizactu = typ_pizactu;
}

void	Cuisinier::setTyp_pizatt(TypePizza typ_pizatt)
{
  this->_typ_pizatt = typ_pizatt;
}

void		Cuisinier::setTime(Time t)
{
  this->_t = t;
}

void		*Cuisinier::setStock(Stock *check)
{
  this->_check = check;
}
